#include<string>
static std::string opers="+-*/%";

enum 
{
    DivZero=1,
    ModZero,
    Unknown
};

template<class T>
class Task{
public:
    Task()
    {}

    Task(T data1,T data2,char op):data1_(data1),data2_(data2),op_(op),exitcode_(0)
    {}

    T run()
    {
        // if(op_=='+')
        // {
        //     return data1_+data2_;
        // } 
        // else if(op_=='-')
        // {
        //     return data1_-data2_;
        // }
        // else if(op_=='*')
        // {
        //     return data1_*data2_;
        // }
        // else if(op_=='/')
        // {
        //     return data1_/data2_;
        // }
        switch(op_)
        {
            case '+':
                result_=data1_+data2_;
                break;
            case '-':
                result_=data1_-data2_;
                break;
            case '*':
                result_=data1_*data2_;
                break;
            case '/':
                if(data2_==0)
                {
                    exitcode_=DivZero;
                }
                else result_=data1_/data2_;
                break;
            case '%':
                //防止出现除零错误时，程序崩溃
                if(data2_==0)
                {
                    exitcode_=ModZero;
                }
                else result_=data1_/data2_;
                break;
        }
    }

    void operator()()
    {
        run();
    }

    void getTask()
    {
       std::cout<<data1_<<op_<<data2_<<"="<<result_<<";exitcode:"<<exitcode_<<std::endl;
    }

private:
    T data1_;
    T data2_;
    char op_;

    T result_;
    int exitcode_;
    
};